package com.cs.beneficios.business.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BaseDAO {

	// Actions
	// ------------------------------------------------------------------------------------

	/**
	 * Retorna un PreparedStatement para la conexion dada, setea el query SQL
	 * con los valores dados en el parametro.
	 * 
	 * @param connection
	 *            La conexion para crear el PreparedStatement.
	 * @param sql
	 *            El query SQL con el cual se contruye el PreparedStatement.
	 * @param values
	 *            Los valores a ser seteados en el PreparedStatement creado.
	 * @throws SQLException
	 *             Si algo falla en la creacion del PreparedStatement.
	 */
	public static PreparedStatement prepareStatement(Connection connection,
			String sql, Object... values) throws SQLException {
		PreparedStatement preparedStatement = connection.prepareStatement(sql);
		setValues(preparedStatement, values);
		return preparedStatement;
	}

	/**
	 * Setea los valores en el PreparedStatement dado.
	 * 
	 * @param preparedStatement
	 *            Es el PreparedStatement en el que se setean los valores.
	 * @param values
	 *            Los valores a ser seteados en el PreparedStatement dado.
	 * @throws SQLException
	 *             Si algo falla en el seteo de los valores del
	 *             PreparedStatement.
	 */
	public static void setValues(PreparedStatement preparedStatement,
			Object... values) throws SQLException {
		for (int i = 0; i < values.length; i++) {
			preparedStatement.setObject(i + 1, values[i]);
		}
	}

	/**
	 * Cierra la conexion. Cualquier error es registrado en el log.
	 * 
	 * @param connection
	 *            La conexion a cerrar.
	 */
	public static void close(Connection connection) {
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				System.err.println("Fallo el cierre de la conexion");
				e.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
			}
		}
	}

	/**
	 * Cierra el Statement. Cualquier error es registrado en el log.
	 * 
	 * @param statement
	 *            El Statement a cerrar.
	 */
	public static void close(Statement statement) {
		if (statement != null) {
			try {
				statement.close();
			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				System.err.println("Fallo el cierre del Statement");
				e.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
			}
		}
	}

	/**
	 * Cierra el ResultSet. Cualquier error es registrado en el log.
	 * 
	 * @param resultSet
	 *            El ResultSet a cerrar.
	 */
	public static void close(ResultSet resultSet) {
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				System.err.println("/******** TDSUB - cwsub");
				System.err.println("Fallo el cierre del ResultSet");
				e.printStackTrace();
				System.err.println("TDSUB - cwsub ********/");
			}
		}
	}

	/**
	 * Cierra el Statement y elResultSet. Cualquier error es registrado en el
	 * log.
	 * 
	 * @param connection
	 *            La conexion a cerrar.
	 * @param statement
	 *            El Statement a cerrar.
	 * @param resultSet
	 *            El ResultSet a cerrar.
	 */
	public static void close(Connection connection, Statement statement,
			ResultSet resultSet) {
		close(resultSet);
		close(statement);
		close(connection);
	}

}